package com.legendframework.core.ioc;

import com.legendframework.core.ioc.annotation.Resource;
import com.legendframework.core.ioc.pojo.GenerateBeanParam;
import com.legendframework.core.AbstractLegendPlugin;
import com.legendframework.core.dao.Return;

import java.lang.reflect.Method;

/**
 * Bean创建接口
 */
public interface IocPool {

    /**
     * 添加一个Class到Class模板池中
     * 预期是想将已知所有 @Component 与 @Bean 返回值的类型存入IOC模板池中
     *
     * @param cls 字节码
     * @param method 方法
     * @param obj 如果是非静态方法该值为执行这个method的对象
     *
     */
    void addClassPool(Class<?> cls, Method method, Object obj , AbstractLegendPlugin plugin);

    default void addClassPool(Class<?> cls , AbstractLegendPlugin plugin){
        addClassPool(cls,null,null , plugin);
    }

    default void addClassPool(Method method, Object obj , AbstractLegendPlugin plugin){
        addClassPool(null,method,obj , plugin);
    }

    /**
     * 根据一个类型获取他的子实现类的Bean生成方式
     * <p>
     * 入参可能是一个接口或者抽象类
     *
     * @param cls cls
     * @return 对应生成方式的所需参数 如果这个@Resource不是必须的且没有找到，则返回NULL
     */
    GenerateBeanParam getBeanTypeByClass(Class<?> cls , Resource resource, AbstractLegendPlugin plugin);

    /**
     * 将对象放入核心容器中，并且进行AOP切面控制
     * @param bean 对象
     * @param beanName 对象名称
     * @return
     */
    <T> Return<String,T> toIoc(T bean , String beanName);
}
